package mytest

import (
	"errors"
	"fmt"
	"sort"
)

func Add(a int, b int) ( int,  error) {
	if a < 0 || b < 0 {
		err := errors.New("a or b is less than zero")
		return 0, err
	}
	return a + b, nil
}

func CallAdd() {
	ret, err := Add(-1, 0)
	if err != nil {
		fmt.Println(err.Error())
	} else {
		fmt.Println(ret)
	}

	ret, err = Add(1, 2)
	if err != nil {
		fmt.Println(err.Error())
	} else {
		fmt.Println(ret)
	}
}

// 可变参数函数例子，可变参数数量，参数类型给定
func SumAll(nums ...int) int {
	sum := 0
	for _, v := range nums {
		sum += v
	}
	fmt.Println(sum)
	return sum
}

// printValues 可以接收任意数量、任意类型的参数
func PrintValues(values ...interface{}) {
	for i, v := range values {
		fmt.Printf("参数 %d: 类型 = %T, 值 = %v\n", i+1, v, v)
	}
}

/*
闭包函数，我理解就是一个带有函数类型返回值的函数，返回一个函数
*/
func AnonymousFunc() func() int {
	count := 0
	return func() int {
		count++
		return count
	}
}

type Apple struct {
	Weight float64
	Color  string
	Size   string
}

// 打印苹果列表
func printApples(apples []Apple) {
	for i, a := range apples {
		fmt.Printf("%d: 重量=%.1f克, 颜色=%s, 大小=%s\n", i+1, a.Weight, a.Color, a.Size)
	}
	fmt.Println()
}

//匿名函数作为函数的传入参数
func SortApples(apples []Apple, lessFunc func(i, j int) bool) {
	// 使用 sort.Slice，它允许我们传入一个比较函数
	sort.Slice(apples, lessFunc)
}

func CallSortApplesWeight() {
	// 创建一批苹果数据
	apples := []Apple{
		{Weight: 150.5, Color: "Red", Size: "M"},
		{Weight: 120.0, Color: "Green", Size: "S"},
		{Weight: 200.0, Color: "Red", Size: "L"},
		{Weight: 130.0, Color: "Yellow", Size: "S"},
		{Weight: 180.0, Color: "Green", Size: "M"},
	}
	printApples(apples)
	// 示例 1：按重量 升序 排序
	fmt.Println("=== 按重量升序排序 ===")
	SortApples(apples, func(i, j int) bool {
		return apples[i].Weight < apples[j].Weight // 升序
	})
	printApples(apples)
}


type MyError struct {
	Code    int
	Message string
}

func (e *MyError) Error() string {
	return fmt.Sprintf("错误码: %d, 信息: %s", e.Code, e.Message)
}

func DoSomething() error {
	return &MyError{
		Code:    404,
		Message: "资源未找到",
	}
}

func CallDoSomething() {
	err := DoSomething()
	if err != nil {
		fmt.Println(err.Error())

		var myErr *MyError
		if errors.As(err, &myErr) { // ✅ 尝试将 err 转为 *MyError 类型
			fmt.Printf("捕捉到自定义错误！\n错误码: %d\n错误信息: %s\n", myErr.Code, myErr.Message)
		} else {
			fmt.Println("其他类型的错误:", err)
		}
	}

}
